# 序列化：将内存中的数据结构（如字典、列表、对象等）转换为可存储（如写入文件）或可传输（如网络发送）的格式（如字符串、二进制）的过程。
# 反序列化：将序列化后的格式（如文件中的内容）还原为内存中原始数据结构的过程。


# ###JOSN
# ##导入json模块
# import json
# ##初始化数据
# data = {
#     "name": "Alice",
#     "age": 30,
#     "hobbies": ["reading", "hiking"],
#     "is_student": False
# }
#
# ##写入文件,序列化
# with open("data.json", "w", encoding="utf-8") as f:
#     json.dump(data, f, indent=2, ensure_ascii=False)
# # 1.with 语句
# #   这是 Python 的上下文管理器语法，作用是自动管理文件资源
# #   当 with 块内的代码执行完毕（无论正常结束还是发生异常），会自动关闭文件，避免手动调用 close() 可能导致的资源泄漏
# # 2.data.json是文件名,w是写入，encoding="utf-8"指定编码文件为UTF-8
# # 3.json.dump()：是json模块的函数，用于将 Python 对象序列化（转换为 JSON 格式）并直接写入文件对象
# #   f是打开的文件对象，indent=2是缩进两个空格，ensure_ascii=False是非 ASCII 字符会按原样写入
#
# #dumps将 Python 数据转为 JSON 字符串    返回字符串
# #dump将 Python 数据转为 JSON 并写入文件  直接写入文件
# json_str = json.dumps(data,indent=2,ensure_ascii=False)
# print(json_str)
#
# ##读取数据，反序列化
# with open("data.json", "r", encoding="utf-8") as f:#r是只读
#     loaded_data = json.load(f)
# #json.load()：是json模块的函数，用于从文件对象中读取 JSON 格式的字符串，并将其转换（反序列化）为对应的 Python 数据类型
# #f是打开的文件对象
#
# print(loaded_data["hobbies"])






import csv

data = [
    {"name": "Alice", "age": 30, "city": "Beijing"},
    {"name": "Bob", "age": 25, "city": "Shanghai"}
]

with open("data.csv", "w", encoding="utf-8", newline="") as f:
    fieldnames = ["name", "age", "city"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(data)
# 1.newline = ""：这是处理CSV文件的关键参数，作用是禁用系统默认的换行符转换：
#   在Windows系统中，默认会将\n转换为\r\n，导致CSV文件中出现多余空行；
#   设置newline = ""后，会保持写入的换行符原样，确保CSV格式正确（这是csv模块官方推荐的写法）
# 2.csv.DictWriter创建一个 csv.DictWriter 对象，用于将字典格式的数据写入 CSV 文件
#   fieldnames=fieldnames：指定表头（与第一步定义的 fieldnames 关联），确保写入的数据与列名对应
# 3.writer.writeheader向 CSV 文件写入表头行，即把 fieldnames 中的元素（"name"、"age"、"city"）作为第一行写入文件
# 4.writer.writerows批量写入多行数据：将列表 data 中的所有字典对象按表头顺序写入 CSV 文件

with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    loaded_data = [row for row in reader]
# 1.csv.DictReader是 csv 模块专门用于按字典格式读取 CSV 文件的工具
#   自动将 CSV 文件的第一行作为表头（键），后续每行数据作为字典的值，形成 {表头1: 值1, 表头2: 值2, ...} 的结构
# 2.row for row in reader通过列表推导式，将 reader 迭代器中的所有行数据转换为字典列表
#   reader 是一个可迭代对象，每次迭代返回一行数据（字典类型），遍历后得到包含所有行的列表

print(loaded_data[0]["age"])
print(int(loaded_data[0]["age"]))
print(loaded_data)








# import pickle
#
# # 1. 定义一个自定义类（演示复杂对象的序列化）
# class Person:
#     def __init__(self, name, age, hobbies):
#         self.name = name
#         self.age = age
#         self.hobbies = hobbies  # 列表类型
#
#     def introduce(self):
#         print(f"我叫{self.name}，今年{self.age}岁，喜欢{','.join(self.hobbies)}")
#
# # 2. 创建一个对象（内存中的数据）
# person = Person("张三", 30, ["读书", "跑步"])
# person.introduce()  # 输出：我叫张三，今年30岁，喜欢读书,跑步
#
# # 3. 序列化：将对象写入文件（内存→磁盘）
# with open("person.pkl", "wb") as f:  # 注意：必须用二进制模式"wb"
#     pickle.dump(person, f)  # 将对象序列化并写入文件
# print("序列化完成，已保存到person.pkl")
#
# # 4. 反序列化：从文件读取并恢复对象（磁盘→内存）
# with open("person.pkl", "rb") as f:  # 注意：必须用二进制模式"rb"
#     loaded_person = pickle.load(f)  # 从文件反序列化出对象
#
# # 验证反序列化结果
# print("\n反序列化后的数据：")
# print(loaded_person.name)  # 输出：张三
# print(loaded_person.age)  # 输出：30
# loaded_person.introduce()  # 输出：我叫张三，今年30岁，喜欢读书,跑步（方法仍可正常调用）





